const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z]*`;
const qnameCapture = `((?:${ncname}\\:)?${ncname})`;
const startTagOpen = new RegExp(`^<${qnameCapture}`); // 捕获标签名
const endTag = new RegExp(`^<\\/${qnameCapture}[^>]*>`); // 铺货标签结尾
const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^"]*)'+|([^\s"'=<>`]+)))?/; // 匹配属性
const startTagClose = /^\s*(\/?)>/; // 匹配标签结束的>
const defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g;

function start(tagName,attr) {
    console.log("开始标签" + tagName + "属性是" + JSON.stringify(attr))
}
function chars(text) {
    console.log("文本是："+text);
}
function end(tagName) {
    console.log("结束标签：" + tagName)
}
function parseHTml(html) {
    console.log(html)
    // 解析html字符串
    while (html){
        let textEnd = html.indexOf('<');
        if(textEnd == 0){
            // 如果当前索引为0，即为一个标签
            let startTagMatch = parseStartTag(html);
            if(startTagMatch) {
                start(startTagMatch.tagName, startTagMatch.attrs);
                // continue; // 如果开始标签匹配完毕后，继续下一次匹配
            }
            let endTagMatch = html.match(endTag);
            if(endTagMatch) {
                advance(endTagMatch[0].length);
                end(endTagMatch[1]);
                continue;
            }
        }
        let text;
        if(textEnd >= 0){
            text = html.substring(0,textEnd);
        }
        if(text){
            advance(text.length);
            chars(text)
        }
    }
    function advance(n) {
        html = html.substring(n);
    }
    function parseStartTag() {
        let start = html.match(startTagOpen);
        if(start){
            const match = {
                tagName:start[1],
                attrs:[]
            }
            advance(start[0].length); // 将标签删除
            let end,attr;
            while (!(end = html.match(startTagClose)) && (attr = html.match(attribute))){
                // 将属性进行解析
                advance(attr[0].length) // 将属性去掉
                match.attrs.push({
                    name:attr[1],
                    value: attr[3] || attr[4] || attr[5]
                })
            }
            if(end){ // 去掉开始标签的 >
                advance(end[0].length);
                return match;
            }
        }
    }
}
export function compileToFunction(template) {
    let root = parseHTml(template)
    console.log(root)
    return function render() {

    }
}
